home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / castools.zip / BUFFEROF.C < prev    next >
Text File  |  1990-01-16  |  2KB  |  70 lines

  1.  
  2.  
  3. /*
  4.    BUFFEROF.C  Function PbBufferOffsets:  prepares a phonebook for buffering
  5.       access to its offset array.
  6.  
  7.    INPUT:  Phonebook structure, size of buffer, and optionally space for the
  8.       buffer.
  9.  
  10.    OUTPUT: If successful, a phonebook structure with buffer fields initialized.
  11. */
  12.  
  13. #include <stdlib.h>
  14. #include <malloc.h>
  15. #include <stdio.h>
  16. #include <phonebk.h>
  17.  
  18. PB * pascal PbBufferOffsets(PB *pb, LONGWORD *OBuffer, WORD OBufferSize)
  19. {
  20.   PB *retval = NULL;            /* default error return */
  21.   int red;                      /* for return value of fread() */
  22.  
  23.   Pberrno = 0;            /* Initially, always reset */
  24.  
  25.   /* First, check params */
  26.   if ((pb == NULL) ||
  27.       (OBufferSize < 4) ||
  28.       (OBufferSize > 4000)) {
  29.     Pberrno = INVALIDPARAMETER;
  30.     return(NULL);
  31.   }
  32.  
  33.   /* Round down OBufferSize, if it isn't a multiple of the buffered item size */
  34.   if (OBufferSize % sizeof(LONGWORD)) {
  35.     OBufferSize -= OBufferSize % sizeof(LONGWORD);
  36.   }
  37.  
  38.   if (!OBuffer) {
  39.     pb->OBuffer = (LONGWORD *)malloc(OBufferSize);
  40.     if (!pb->OBuffer) {
  41.       Pberrno = OUTOFMEM;
  42.       return(NULL);
  43.     }
  44.   }
  45.   else {
  46.     pb->OBuffer = OBuffer;
  47.   }
  48.  
  49.   if (fseek(pb->fp, 160L, SEEK_SET)) {
  50.     Pberrno =  FSEEKERROR;
  51.     goto closeup;
  52.   }
  53.   red = fread(pb->OBuffer,
  54.               sizeof(LONGWORD),
  55.               OBufferSize/sizeof(LONGWORD),
  56.               pb->fp);
  57.   if (red != OBufferSize/sizeof(LONGWORD)) {
  58.     Pberrno = CANTREAD;
  59.     goto closeup;
  60.   }
  61.   pb->OBufferSize = OBufferSize;
  62.   pb->FirstOBufferRID = 0;
  63.   return(pb);
  64. closeup:
  65.   if (!OBuffer) {
  66.     free(pb->OBuffer);
  67.   }
  68.   return(retval);
  69. }
  70.